package com.sisgesbyte.dao.administracion;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.AtencionClienteRequest;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.administracion.AtencionClienteEntity;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.comun.GenericResponseEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoAtencionClienteDaoImpl extends AbstractFacade<AtencionClienteEntity> implements MantenimientoAtencionClienteDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public MantenimientoAtencionClienteDaoImpl() {
		super(AtencionClienteEntity.class);
	}

	@Override
	public List<AtencionClienteEntity> listaAtencionCliente( FiltrosSQLBean cadenaFiltros) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT  ac.id,ac.codigo, ac.nombre, ac.apellido, ac.email, ac.telefono, ac.tema_atencion_id, ");
		jpql.append("ta.descripcion tema, ac.area_empresa_id,ae.nombre area, ac.asunto, ac.motivo, ac.estado_id, ");
		jpql.append("ac.fecha_registro, e.nombre estado,ac.active ");
		jpql.append("FROM administracion.atencion_cliente ac ");
		jpql.append("inner join administracion.tema_atencion ta on ac.tema_atencion_id=ta.id  ");
		jpql.append("inner join administracion.area_empresa ae on ac.area_empresa_id=ae.id  ");
		jpql.append("inner join administracion.estado e on ac.estado_id=e.id   ");
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(), AtencionClienteEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<AtencionClienteEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericResponseEntity guardarAtencionCliente( AtencionClienteRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT *  from administracion.sp_registrar_atencion_cliente(:in_nombre, :in_apellido, :in_email, :in_telefono, ");
		jpql.append(":in_tema_atencion_id, :in_area_empresa_id, :in_asunto, :in_motivo, :in_estado_id, :in_active) ");

		Query query = em.createNativeQuery(jpql.toString(), GenericResponseEntity.class);
		
		query.setParameter("in_nombre", request.getNombre());
		query.setParameter("in_apellido", request.getApellido());
		query.setParameter("in_email", request.getEmail());
		query.setParameter("in_telefono", request.getTelefono());
		query.setParameter("in_tema_atencion_id", request.getTemaAtencionId());
		query.setParameter("in_area_empresa_id", request.getAreaEmpresaId());
		query.setParameter("in_asunto", request.getAsunto());
		query.setParameter("in_motivo", request.getMotivo());
		query.setParameter("in_estado_id", request.getEstadoId());
		query.setParameter("in_active", request.getActive());

		return (GenericResponseEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarAtencionCliente( AtencionClienteRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT *  from administracion.sp_actualizar_atencion_cliente(:in_id,:in_nombre, :in_apellido, :in_email, :in_telefono, ");
		jpql.append(":in_tema_atencion_id, :in_area_empresa_id, :in_asunto, :in_motivo, :in_estado_id, :in_active) ");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		System.out.println("in_id: "+ request.getId());
		query.setParameter("in_id", request.getId());
		query.setParameter("in_nombre", request.getNombre());
		query.setParameter("in_apellido", request.getApellido());
		query.setParameter("in_email", request.getEmail());
		query.setParameter("in_telefono", request.getTelefono());
		query.setParameter("in_tema_atencion_id", request.getTemaAtencionId());
		query.setParameter("in_area_empresa_id", request.getAreaEmpresaId());
		query.setParameter("in_asunto", request.getAsunto());
		query.setParameter("in_motivo", request.getMotivo());
		query.setParameter("in_estado_id", request.getEstadoId());
		System.out.println("Activo: "+request.getActive());
		query.setParameter("in_active", request.getActive());
		
		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarAtencionCliente(int codAtencionCliente) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_eliminar_atencion_cliente(:in_id)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", codAtencionCliente);

		return (GenericEntity) query.getSingleResult();
	}
	
}
